www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/rate_match.m

    function e = rate_match(d,iUE,iTB,iCB)
% 速率匹配实现,包括子块交织,比特收集,比特选取和凿孔  
% 输入:d:速率匹配输入信息
%       iUE:第iUE个用户
%       iTB:第iTB个传输块
%       iCB:第iCB个码块
% 输出:e:速率匹配输出
% 
%  参考 36.212 V8.6.0 第5.1.4节
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-06-20
%  ==========================================================

global LTE_par
C = LTE_par.UE_par.nCB(iTB,iUE); % 第i个用户的分块数
Qm = LTE_par.UE_par.Qm(iTB,iUE); % 第i个用户的第i个传输块使用的调制方式
nTB = LTE_par.UE_par.nCW(iUE);   % 第i个用户可用TB数
nRE = LTE_par.UE_par.nRE(iUE);       % 用户可用资源粒子数
rvidx = LTE_par.UE_par.rvidx(iTB,iUE); % 冗余版本号 rvidx取值为0~3
nLayer = LTE_par.UE_par.nLayer(iUE); % 第i个用户可用层数
category = LTE_par.UE_par.category;  % UE终端等级
KMIMO = LTE_par.UE_par.KMIMO; % 如果PDSCH传输模式为3或4,该值取2,其他情况下取1

% 其他固定参数
M_DL_HARQ = 8;
Mlimit = 8;
cSubTC = 32; % 交织深度
Nsoft = [250368 1237248 1237248 1827072 3667200]; % 软信道比特总和 36.306 V9.1.0
interleaverPattern = [0 16 8 24 4 20 12 28 2 18 10 26 6 22 14 30 1 17 9 25 5 21 13 29 3 19 11 27 7 23 15 31]+1;% 子块交织器列变换样式 表5.1.4-1

% 映射到一个传输层 NL = 1 映射到2或4个传输层 NL = 2
if nLayer == 2 && nTB == 1
    NL = 2;
    G = 2*nRE;
elseif nLayer == 3 && nTB == 2
    if iTB == 1
        NL = 1;
        G = nRE;
    else
        NL = 2;
        G = 2*nRE;
    end
elseif nLayer == 4 && nTB == 2
    NL = 2;
    G = 2*nRE;
else
    NL = 1;
    G = nRE;
end

% ===================== 子块交织 ==================================
[rowD,colD] = size(d);          % turbo 编码后输出矩阵大小
rSubTC = ceil(colD/cSubTC);     % 确定交织矩阵的行数
nPostLeav = rSubTC*cSubTC;      % 交织输出的行向量包含的数据个数
v = zeros(rowD,nPostLeav);      % 存储子块交织后三流数据

% 如果输入比特数小于交织矩阵大小,则添加dummy bit
if(nPostLeav) > colD
    ND = nPostLeav-colD;
    d = [NaN*ones(rowD,ND),d]; 
end

iRow = 1;
while iRow < rowD
    interleaverMatrix = transpose(reshape(d(iRow,:),cSubTC,rSubTC)); % 先按行优先将d放到一个矩阵中,对其转置,得到列优先放置矩阵
    interleaverMatrix = interleaverMatrix(:,interleaverPattern); % 按照交织器列变换样式变换
    v(iRow,:) = interleaverMatrix(:); % 按列优先顺序读取
    iRow = iRow+1;
end

alphaPi = zeros(1,nPostLeav);
for k = 1:nPostLeav
    t = floor((k-1)/rSubTC)+1;
   alphaPi(k) = mod(interleaverPattern(t)-1+cSubTC*(mod((k-1),rSubTC))+1,nPostLeav); % RSC2 路数据交织表 
end
alphaPi = alphaPi+1;
v(iRow,:) = d(iRow,alphaPi);

% disp('速率匹配的alphaPi')
% disp(alphaPi)
% ===================== 比特收集 ===================================
circularBufLen = rowD*nPostLeav; % 循环缓冲长度
w = zeros(1,circularBufLen);
w(1:nPostLeav) = v(1,:);
w(nPostLeav+1:2:end) = v(2,:);
w(nPostLeav+2:2:end) = v(3,:);
nanPosition = isnan(w); % 记录NaN的位置

% disp('速率匹配的w')
% disp(w)
% ===================== 比特选取和凿孔 ==============================
NIR = floor(Nsoft(category)/(KMIMO*min(M_DL_HARQ,Mlimit)));
Ncb = min(floor(NIR/C),circularBufLen);
GG = G/NL; % 此处G表示复值符号数 和标准中差Qm倍
gama = mod(GG,C);
if iCB-1 <= C-gama-1
    E = NL*Qm*floor(GG/C);
else
    E =  NL*Qm*ceil(GG/C);
end
e = zeros(1,E);

% Matlab的第一个字符下标为1 当前RV版本从k0+1开始取值(含k0+1)
k0 = rSubTC*(2*ceil(Ncb/(8*rSubTC))*rvidx+2); 
k = 1;
j = 0;
while(k<=E)
   if ~isnan(w(mod(k0+j,Ncb)+1))
       e(k) = w(mod(k0+j,Ncb)+1);
       k = k+1;
   end
   j = j+1;
end

LTE_par.UE_par.E(iTB,iUE) = E;
LTE_par.UE_par.rSubTC(iTB,iUE) = rSubTC;
LTE_par.UE_par.Ncb(iTB,iUE) = Ncb;
LTE_par.UE_par.turboOutputSize(iTB,iUE) = colD;
LTE_par.UE_par.nanPosition{iTB,iUE} = nanPosition;